package com.tomoki.iwai.deviceinfo.db.dto;

import java.util.EnumMap;
import java.util.Map;

import com.google.appengine.repackaged.com.google.common.base.Joiner;

/**
 * AndroidDeviceInfoListテーブルのDTOクラス
 */
public class AndroidDeviceInfoList
{
	public static final String NAME = "913439";
	
	/** カラム定義 */
	public static enum COLUMNS {
		Model,
		Felica,
		Board,
		Brand,
		Cpu_Abi,
		Device,
		Display,
		FingerPrint,
		Host,
		Id,
		Manufacture,
		Product,
		Type,
		Tags,
		User,
		Time,
		Version_Codename,
		Version_Incremental,
		Version_Release,
		Version_Sdk,
		Version_Sdk_Int,
		Useragent,
		Sensors,
		Density,
		Density_Dpi,
		Scaled_Density,
		X_Dpi,
		Y_Dpi,
		Width_Pixels,
		Height_Pixels,
		Antibanding,
		Color_Effect,
		Flash_Mode,
		Format,
		Picture_Size,
		Jpeg_Thumbnail_Size,
		Preview_Fps_Range,
		Preview_Size,
		Scene_Mode,
		Video_Size,
		Zoom,
		Smooth_Zoom,
		Max_Zoom,
		White_Balance;
		
		@Override
		public String toString()
		{
			return this.name();
		}
	};
	
	/** データ(Key:カラム Value:値) */
	private Map<COLUMNS, String> mData = new EnumMap<COLUMNS, String>(COLUMNS.class);
	
	/**
	 * 値を設定する。
	 * 
	 * @param column カラム
	 * @param value 値
	 */
	public void set(COLUMNS column, String value)
	{
		mData.put(column, value);
	}
	
	/**
	 * 値を取得する。
	 * 
	 * @param column カラム
	 * @return 値
	 */
	public String get(COLUMNS column)
	{
		return mData.get(column);
	}
	
	/**
	 * Insert SQL文を構築する。
	 * 
	 * @return Insert SQL
	 */
	public String createInsertSql()
	{
		StringBuffer query = new StringBuffer("INSERT INTO ").append(NAME)
			.append("(")
			.append(Joiner.on(',').join(COLUMNS.values()))
			.append(") VALUES (");
		
		int cnt = 0;
		for (COLUMNS each : COLUMNS.values())
		{
			if (cnt != 0)
			{
				query.append(',');
			}
			String value = get(each);
			query
				.append("'")
				.append(value == null ? "" : value)
				.append("'");
			cnt++;
		}
		
		query.append(")");
		
		return query.toString();
	}
	
	/**
	 * Select Count SQL文を構築する。
	 * 
	 * @param fingerPrint Build.FINGERPRINT
	 * @return
	 */
	public String createCountSql()
	{
		String fingerPrint = mData.get(COLUMNS.FingerPrint);
		
		if (fingerPrint == null || fingerPrint.length() == 0)
		{
			throw new IllegalArgumentException("fingerPrint must be set.");
		}
		
		StringBuffer query = new StringBuffer("SELECT COUNT() FROM ").append(NAME)
			.append(" WHERE ")
			.append(COLUMNS.FingerPrint)
			.append(" = '")
			.append(fingerPrint)
			.append("'")
			.append(" GROUP BY ")
			.append(COLUMNS.FingerPrint);
		
		return query.toString();
	}
}
